#!/usr/bin/env perl
use warnings;
use strict;

#
# Take a file of format (where [.] denote optional text)
# movie,user[,rating][,date]
# movie,user[,rating][,date]
# movie,user[,rating][,date]
# ...
# in no particular order
# and produce an equivalent file of format
# movie:
# user[,rating][,date]
# user[,rating][,date]
# ...
# movie:
# user[,rating][,date]
# ...
# ordered like the given file with format
# movie,user[,...]
# movie,user[,...]
# ...
# 
# Takes one argument: the name of the file to order by; uses magic Perl open,
# so this can be a command followed by a pipe.
#
# You can also use it in the inverse sense (movies for users).
#

scalar(@ARGV) == 1 or die "need order file as argument";
my ($order_file) = @ARGV;

# A hash of string keys... not very efficient but it works.
my @input_lines = <STDIN>;
my %input_hash = map {
  /^(\d+),(\d+)?(.*)$/ or die "unexpected input line format ($_)";
  "$1,$2" => $3;
} @input_lines;

# Output in order according to the order file. 
open(ORDER_FILE, $order_file);
while (<ORDER_FILE>) {
  chomp;
  /^(\d+),(\d+).*$/ or die "unexpected tuple line format ($_)";
  my $input_val = $input_hash{"$1,$2"};
  if (defined($input_val)) {
    print "$1,$2$input_val\n";
  }
}
close ORDER_FILE;

# Copyright (c) 2009 John Lees-Miller
# 
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation
# files (the "Software"), to deal in the Software without
# restriction, including without limitation the rights to use,
# copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following
# conditions:
# 
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
# 
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
# OTHER DEALINGS IN THE SOFTWARE.

